//
// Created by user on 25-9-9.
//

#ifndef CAMERA_H
#define CAMERA_H

#include <Arduino.h>
#include <esp_camera.h>
#include <cstdint>

// 添加图像宽度和高度定义
#define EI_CAMERA_RAW_FRAME_BUFFER_COLS  160     // 摄像头原始帧宽度
#define EI_CAMERA_RAW_FRAME_BUFFER_ROWS  120     // 摄像头原始帧高度
#define EI_CLASSIFIER_INPUT_WIDTH        160     // 分类器输入宽度
#define EI_CLASSIFIER_INPUT_HEIGHT       120     // 分类器输入高度

// 图像格式枚举
typedef enum {
    CAMERA_PIXFORMAT_GRAYSCALE = 0,  // 灰度图像
    CAMERA_PIXFORMAT_RGB565,         // RGB565格式
    CAMERA_PIXFORMAT_RGB888,         // RGB888格式
    CAMERA_PIXFORMAT_JPEG            // JPEG格式
} camera_pixformat_t;

class Camera {
private:
    bool is_initialised = false;
    
    // 摄像头配置 - 适用于XIAO ESP32S3摄像头
    static camera_config_t camera_config;

public:
    Camera();
    ~Camera() = default;
    
    // 初始化摄像头
    bool begin();
    
    // 释放摄像头资源
    void end();
    
    // 捕获图像（直接返回帧缓冲区）
    camera_fb_t* capture();
    
    // 捕获图像并转换为RGB888格式
    bool capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf);
    
    // 捕获图像并通过串口发送
    bool captureAndSend();
    
    // 设置图像格式
    bool setPixelFormat(pixformat_t format);
    
    // 设置图像帧大小
    bool setFrameSize(framesize_t size);
    
    // 检查摄像头是否已初始化
    bool isInitialized() const;
    
    // 将JPEG图像转换为RGB888格式
    bool jpegToRGB888(camera_fb_t* fb, uint8_t* output_buffer);
    
    // 调整图像大小
    bool resizeImage(uint8_t* input_buffer, int input_width, int input_height, 
                     uint8_t* output_buffer, int output_width, int output_height);
};

#endif //CAMERA_H